Назначение обработчиков событий с помощью подписок на события

О чем эта статья

Механизм подписок на событие предназначен для назначения обработчика события для одного или нескольких объектов конфигурации платформы «1С:Предприятие». В статье рассматриваются несколько примеров применения данного механизма. Изучив статью, вы узнаете:

  • Что такое подписка на событие и как его применять на практике?
  • Как выполнить проверку дублирования наименования при записи элемента справочника без модификации модулей самого справочника?
  • Как, при помощи подписки на событие, обеспечить формирование движений по регистру накопления при проведении документа?
  • Как обеспечить подмену основной формы документа?

Применимость

В статье рассматривается платформа «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

Подписки на события

В статье рассматриваются несколько примеров применения одного из вспомогательных объектов платформы «1С:Предприятие 8» – подписок на события.

Подписки на события позволяют размещать в общих модулях внешние обработчики, которые будут исполняться после выполнения определенного обработчика события в модуле объекта или модуле менеджера.

При этом не потребуется вносить изменения в модуль объекта или модуль менеджера. Таким образом, возникает возможность программного расширения модулей без их модификации – это очень полезный прием при изменении типовых решений.

Подписки на события описываются в ветке Общие окна объектов конфигурации (Рис.1).

1С 8 Подписки на события

Если в конфигурации создана подписка на событие некоторого объекта, например событие ПередЗаписью() объекта документа, то при возникновении этого события платформа выполняет следующую последовательность действий.

  1. Выполняется обработчик события ПередЗаписью() в модуле объекта документа.
  2. Если в ходе выполнения обработчика параметр Отказ принимает значение Истина или вызывается исключение, то обработка события прерывается.
  3. Если на втором шаге обработка события не прерывалась, то выполняются внешние обработчики (подписки на события), определенные для события ПередЗаписью().
  4. Если в ходе выполнения внешнего обработчика параметр Отказ принимает значение Истина или вызывается исключение, то выполнение внешнего обработчика прерывается.

С помощью подписок на события можно организовать выполнение различных проверок, выполняющихся при записи объектов в базу данных.

Задача 1

Выполнить проверку дублирования наименования при записи элемента справочника “Контрагенты” – без модификации модулей самого справочника.

Для решения задачи нужно создать общий модуль ОбработчикиПодписокНаСобытия. В палитре свойств модуля установить флаг Сервер и Клиент (обычное приложение). Второй флаг нужен для того, чтобы подписка на событие работала в обычном приложении.

Флаг Клиент (обычное приложение) доступен, если в параметрах конфигуратора установлен режим редактирования Управляемое приложение и обычное приложение.

В ветке Общие окна объектов конфигурации создать новую подписку на событие. В палитре свойств ввести имя подписки ПроверкаНаименованияСправочника. В поле выбора Источник отметить тип данных СправочникОбъект.Контрагенты. В поле выбора Событие выбрать событие ПередЗаписью(). После отработки этого события будет срабатывать процедура обработки подписки на событие (Рис. 2).

Процедура обработки подписки на событие

В поле выбора Обработчик указывается общий модуль, в котором располагается обработчик подписки на событие. Нажать в этом поле кнопку Открыть, выбрать модуль ОбработчикиПодписокНаСобытия и нажать ОК. Система автоматически создаст в общем модуле процедуру ПроверкаНаименованияСправочникаПередЗаписью() с параметрами Источник и Отказ. В параметре Источник передается объект, для которого создана подписка на события – СправочникОбъект.<Наименование справочника>. В параметре Отказ передается признак отказа от записи элемента.

В процедуре ПроверкаНаименованияСправочникаПередЗаписью() выполняется запрос к справочнику Контрагенты. В качестве параметра запроса передается наименование записываемого элемента справочника Контрагенты. Если элемент с таким названием уже есть в базе данных, то параметр Отказ устанавливается в значение Истина (запись элемента отменяется) и выводится соответствующее диагностическое сообщение.

Листинг процедуры ПроверкаНаименованияСправочникаПередЗаписью()

Листинг процедуры ПроверкаНаименованияСправочникаПередЗаписью

На практике может встретиться задача выполнения движений по дополнительным регистрам при проведении документов в типовых конфигурациях. Создание дополнительных регистров позволяет избежать модификации существующих регистров и при этом получить возможность дополнительной обработки данных при проведении типовых документов.

Задача 2

Создать оборотный регистр накопления “Выбытия денежных средств” и обеспечить формирование движений по этому регистру при проведении документа “Расходный кассовый ордер”, используя механизм подписок на события.

Создать новый оборотный регистр с именем ВыбытияДенежныхСредств. Выбрать регистратор “Расходный кассовый ордер”. Добавить измерения регистра:

Касса, тип: СправочникСсылка.Кассы;
Статья, тип: СправочникСсылка.СтатьиДвиженияДенежныхСредств.

Создать ресурс регистра:

Сумма, тип Число, Длина – 15, Точность – 2.

В документе “Расходный кассовый ордер” создать реквизит СтатьяДвижения с типом данных СправочникСсылка.СтатьиДвиженияДенежныхСредств.

Создать новую подписку на событие:

Имя – ДвиженияПоВыбытиюДенежныхСредств;
Источник – ДокументОбъект.РКО;
Событие – ОбработкаПроведения.

В общем модуле ОбработчикиПодписокНаСобытия создать обработчик ДвиженияПоВыбытиюДенежныхСредствОбработкаПроведения(). В обработчике осуществляется обход табличной части документа “Расходный кассовый ордер” и формируются движения в регистре накопления ВыбытияДенежныхСредств.

Листинг процедуры ДвиженияПоВыбытиюДенежныхСредствОбработкаПроведения()

Листинг процедуры ДвиженияПоВыбытиюДенежныхСредствОбработкаПроведения

В типовых конфигурациях может возникнуть необходимость доработки основной формы некоторого объекта, например документа. Эту задачу можно решить с помощью подписок на события. При этом создается копия основной формы документа. В новую форму вносятся необходимые изменения. С помощью механизма подписок на события обеспечивается открытие новой формы вместо основной формы. При этом основная форма, находящаяся на поддержке, остается без изменения.

Задача 3

Обеспечить подмену основной формы документа “Расходный кассовый ордер”.

Создать новую форму документа “Расходный кассовый ордер” с именем ФормаДокументаКлиентская. Внести в форму произвольные изменения, например, поменять порядок элементов управления. Для вызова этой формы необходимо использовать подписку на событие ОбработкаПолученияФормы() в модуле менеджера документа “Расходный кассовый ордер”.

Создать новую подписку на событие:

Имя – ОсновнаяФормаРКО;
Источник – ДокументМенеджер.РКО;
Событие – ОбработкаПолученияФормы.

В общем модуле ОбработчикиПодписокНаСобытия создать обработчик ОсновнаяФормаРКООбработкаПолученияФормы(). В обработчик в качестве параметра ВыбраннаяФорма передается имя открываемой формы.
Параметр СтандартнаяОбработка устанавливается в значении Ложь для отключения открытия основной формы.

Листинг процедуры ОсновнаяФормаРКООбработкаПолученияФормы()

Листинг процедуры ОсновнаяФормаРКООбработкаПолученияФормы

Для поиска подписок на события, определенных для некоторого объекта конфигурации, можно использовать механизм поиска ссылок на объекты. Для этого нужно выбрать объект в окне объектов конфигурации и в контекстном меню выполнить команду Поиск ссылок на объект. В результате выполнения команды в окне служебных сообщений будет выведен список объектов, в которых имеются ссылки на искомый объект.

Таким образом, подписки на события предоставляют возможность добавления нового функционала, не изменяя существующие модули объектов. К недостаткам подписок на события можно отнести:

  • Увеличение сложности алгоритмов.
  • Подписаться можно только на события объектов и менеджеров объектов.

Если необходимо модифицировать какое-либо событие формы, то механизм подписок на события не доступен. В этом случае, необходимо вносить изменения в саму форму или копировать форму и вносить изменения в новый объект.

Статья опубликована по материалам курса
“1С:Программист – Быстрый старт в профессию!”.

Комментарии / обсуждение (18):

  1. Николай

    Спасибо! Полезно. Но [Документ]Менеджер и Событие – ОбработкаПолученияФормы срабатывает только для Управляемых форм. В толстом клиенте я не добился.(Нужна подмена на управляемую) :(
    В случае явного вызова формы по имени из текста модуля: ОткрытьФорму(“Документ.РКО.[Форма.ФормаДокумента]”) :((.
    Вопрос поддержки доработки типовых решений – остается открытым “ДостаточноСложноНет”.

  2. raven30

    Очень полезная и продуктивная статья. Спасибо.

  3. sergiobargio

    Спасибо большое. Хорошее подробное описание. По задаче №1 отрабатывает хорошо, если пользователь нажимает “записать”, а вот если нажимает сразу “ОК”, то выпадает сообщение об ошибке:
    “…{Справочник.Контрагенты.Форма.ФормаЭлемента1.Форма(499)}: Ошибка при вызове метода контекста (ЗаписатьВФорме)
    ЗаписатьВФорме();
    по причине:
    Не удалось записать: “Контрагенты”!
    …”

    • Евгений Гилев (Мастер-тренер)

      Добрый день!

      Уточните ошибка связана именно с подпиской на событие?
      Что будет, если код в подписке (в процедуре) вынести в комментарии?

  4. InStep

    Спасибо за статью.
    Вопрос – а в чем смысл открытия “своей” формы через события, если ее можно указать основной в свойствах объекта? Или это просто как иллюстрация использования подписок?

    • Евгений Гилев (Мастер-тренер)

      Во-первых, это демонстрация.
      Во-вторых, часто хотят вообще не трогать типовые объекты, в том числе изменять основные формы..

  5. Ku2sha

    Статья – кусочек айсберга! =)) Пишите ещё!

    Спасибо.

  6. Алексей

    Как работает механизм подписок, если их несколько? К примеру если есть подписка на событие при записи справочника, документа и добавляется еще одна и на справочник и на документ? Спасибо

    • Евгений Гилев (Мастер-тренер)

      По всей видимости речь идет о последовательности вызова подписок на события.
      Их порядок неопределен и в разных условиях (СУБД, вариант работы ИБ, ОС, …) последовательность может различной.

  7. Евгений

    Отличная статья для начинающих разработчиков. В качестве идеи
    хочу предложить Вам написать статью о
    программной модификации форм
    и нетривиальном способе переопределения событий форм.

  8. Александр

    Добрый день!
    Небольшое уточнение: надо писать (у документа и у справочника)

    Если ВидФормы=”ФормаОбъекта” Тогда
    …..
    КонецЕсли;

    P.S. Версия платформы 1С:Предприятие 8.3 (8.3.4.365)

    • Евгений Гилев (Мастер-тренер)

      Добрый день!

      Да, поправим этот момент :)

  9. Аноним

    Спасибо, очень интересная, а главное полезная статья!

  10. morrovv

    Пошел переписывать код :( эх с месяц назад бы эту статью. Большое спасибо.

  11. aldo

    Спасибо. Очень хорошая статья. Правда она рождает множество вопросов:
    Предположим, мы хотим использовать эти знания в типовой конфигурации, но не хотим ее снимать с поддержки целиком,
    можно ли добавить свой обработчик событий. И как бы это сделать аккуратней.

    • Евгений Гилев (Мастер-тренер)

      Спасибо за обратную связь!

      но не хотим ее снимать с поддержки целиком

      Снимать с поддержки конфигурацию и не нужно.

      Достаточно включить возможность изменения для конфигурации и сделать возможность редактирования корневого узла конфигурации.

      В этом случае обновление будет проходить в штатном режиме (из Конфигуратора), а Вы получите возможность добавлять новую функциональность в конфигурацию.

Комментарии закрыты

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.